/**
 * HTML代码管理API服务类
 * 提供HTML代码相关的所有API操作
 * 继承自BaseService，获得基础的CRUD操作方法
 * 并扩展了HTML代码特有的业务方法
 * 支持模拟数据和真实API两种模式
 */

// 导入依赖模块
// 导入基础服务类，获得通用的CRUD操作
import { BaseService } from '../base-service.js';
// 导入API端点配置，获取HTML代码相关的接口路径
import { API_ENDPOINTS, API_CONFIG } from '../config.js';
// 导入模拟数据函数
import {
  getMockHtmlCodesList,
  getMockHtmlCodeDetail,
  createMockHtmlCode,
  updateMockHtmlCode,
  deleteMockHtmlCode,
  getMockHtmlCodeStats,
  validateMockHtmlCode,
  previewMockHtmlCode
} from '../mock-data/html-code-mock-data.js';

// HTML代码服务类定义
// 继承自BaseService，获得基础的数据操作方法
class HtmlCodeService extends BaseService {
  /**
   * 构造函数
   * 初始化HTML代码服务的端点和配置
   * 使用API_ENDPOINTS.HTML_CODES.LIST作为基础端点
   */
  constructor() {
    // 调用父类构造函数，设置API端点
    super(API_ENDPOINTS.HTML_CODES.LIST);
  }

  /**
   * 检查是否使用模拟数据
   * 根据配置决定使用模拟数据还是真实API
   * @returns {boolean} 是否使用模拟数据
   */
  get useMockData() {
    return API_CONFIG.HTML_CODE_MANAGEMENT.USE_MOCK_DATA;
  }

  /**
   * 模拟网络延迟
   * 在模拟数据模式下模拟真实的网络请求延迟
   * @param {number} delay - 延迟时间（毫秒）
   * @returns {Promise} 延迟Promise
   */
  async mockDelay(delay = API_CONFIG.HTML_CODE_MANAGEMENT.MOCK_DELAY) {
    return new Promise(resolve => setTimeout(resolve, delay));
  }

  /**
   * 获取HTML代码列表
   * 获取符合条件的所有HTML代码，支持分页、搜索、筛选等功能
   * @param {object} params - 查询参数对象
   * @param {number} params.page - 页码，从1开始，默认1
   * @param {number} params.pageSize - 每页数量，默认10，最大100
   * @param {string} params.search - 搜索关键词，会在名称、内容中搜索
   * @param {string} params.workspaceId - 工作空间ID筛选
   * @param {string} params.appId - 应用ID筛选
   * @param {string} params.pageId - 页面ID筛选
   * @param {object} options - 请求选项配置
   * @returns {Promise<object>} HTML代码列表数据和分页信息
   */
  async getHtmlCodes(params = {}, options = {}) {
    console.log('getHtmlCodes', params);
    console.log('this.useMockData', this.useMockData);
    // 如果使用模拟数据，返回模拟数据
    if (this.useMockData) {
      await this.mockDelay();
      return getMockHtmlCodesList(params);
    }
    
    // 否则调用父类的getList方法获取真实数据
    return this.getList(params, options);
  }

  /**
   * 获取HTML代码详情
   * 根据ID获取单个HTML代码的完整信息
   * @param {string|number} id - HTML代码的唯一标识符
   * @param {object} options - 请求选项配置
   * @returns {Promise<object>} HTML代码详细信息，包含基本信息和HTML内容
   */
  async getHtmlCode(id, options = {}) {
    // 如果使用模拟数据，返回模拟数据
    if (this.useMockData) {
      await this.mockDelay();
      const result = getMockHtmlCodeDetail(id);
      if (!result) {
        throw new Error('HTML代码不存在');
      }
      return result;
    }
    
    // 否则调用父类的getDetail方法获取真实数据
    return this.getDetail(id, options);
  }

  /**
   * 创建HTML代码
   * 创建一个新的HTML代码记录
   * @param {object} htmlCodeData - HTML代码数据对象
   * @param {string} htmlCodeData.name - 页面名称，必填字段
   * @param {string} htmlCodeData.page - HTML代码内容，必填字段
   * @param {string} htmlCodeData.workspaceId - 工作空间ID
   * @param {string} htmlCodeData.pageId - 页面ID
   * @param {string} htmlCodeData.appId - 应用ID
   * @param {string} htmlCodeData.content - 内容描述
   * @param {object} options - 请求选项配置
   * @returns {Promise<object>} 创建成功后的HTML代码数据
   */
  async createHtmlCode(htmlCodeData, options = {}) {
    // 如果使用模拟数据，返回模拟数据
    if (this.useMockData) {
      await this.mockDelay();
      return createMockHtmlCode(htmlCodeData);
    }
    
    // 否则调用父类的create方法创建真实数据
    return this.create(htmlCodeData, options);
  }

  /**
   * 更新HTML代码
   * 完整更新HTML代码的所有信息
   * @param {string|number} id - HTML代码的唯一标识符
   * @param {object} htmlCodeData - 要更新的HTML代码数据对象
   * @param {object} options - 请求选项配置
   * @returns {Promise<object>} 更新成功后的HTML代码数据
   */
  async updateHtmlCode(id, htmlCodeData, options = {}) {
    // 如果使用模拟数据，返回模拟数据
    if (this.useMockData) {
      await this.mockDelay();
      const result = updateMockHtmlCode(id, htmlCodeData);
      if (!result) {
        throw new Error('HTML代码不存在');
      }
      return result;
    }
    
    // 否则调用父类的update方法更新真实数据
    return this.update(id, htmlCodeData, options);
  }

  /**
   * 更新HTML代码内容（CLOB字段）
   * 专门用于更新HTML代码的`page`字段，通常用于代码编辑器保存
   * @param {string|number} id - HTML代码的唯一标识符
   * @param {string} htmlContent - 新的HTML代码内容
   * @param {object} options - 请求选项配置
   * @returns {Promise<object>} 更新成功后的HTML代码数据
   */
  async updateHtmlContent(id, htmlContent, options = {}) {
    // 如果使用模拟数据，返回模拟数据
    if (this.useMockData) {
      await this.mockDelay();
      const result = updateMockHtmlCode(id, { page: htmlContent });
      if (!result) {
        throw new Error('HTML代码不存在');
      }
      return result;
    }
    
    // 否则使用PATCH方法只更新page字段
    return this.patch(id, { 
      page: htmlContent,
      updated_at: new Date().toISOString() // 更新时间
    }, options);
  }

  /**
   * 删除HTML代码
   * 根据ID删除指定的HTML代码记录
   * @param {string|number} id - 要删除的HTML代码的唯一标识符
   * @param {object} options - 请求选项配置
   * @returns {Promise<object>} 删除操作的结果信息
   */
  async deleteHtmlCode(id, options = {}) {
    // 如果使用模拟数据，返回模拟数据
    if (this.useMockData) {
      await this.mockDelay();
      const success = deleteMockHtmlCode(id);
      if (!success) {
        throw new Error('删除失败');
      }
      return { success: true, message: '删除成功' };
    }
    
    // 否则调用父类的delete方法删除真实数据
    return this.delete(id, options);
  }

  /**
   * 批量删除HTML代码
   * 一次性删除多个HTML代码记录
   * @param {Array<string|number>} ids - 要删除的HTML代码ID数组
   * @param {object} options - 请求选项配置
   * @returns {Promise<object>} 批量删除操作的结果信息
   */
  async batchDeleteHtmlCodes(ids, options = {}) {
    // 如果使用模拟数据，返回模拟数据
    if (this.useMockData) {
      await this.mockDelay();
      const results = ids.map(id => deleteMockHtmlCode(id));
      const successCount = results.filter(Boolean).length;
      return {
        success: true,
        message: `成功删除 ${successCount} 条记录`,
        deletedCount: successCount
      };
    }
    
    // 否则调用父类的batchDelete方法批量删除真实数据
    return this.batchDelete(ids, options);
  }

  /**
   * 获取HTML代码统计数据
   * 获取HTML代码的统计信息，如总数、按工作空间/应用分类统计等
   * @param {object} params - 统计查询参数
   * @param {object} options - 请求选项配置
   * @returns {Promise<object>} 统计数据对象
   */
  async getHtmlCodeStats(params = {}, options = {}) {
    // 如果使用模拟数据，返回模拟数据
    if (this.useMockData) {
      await this.mockDelay();
      return getMockHtmlCodeStats(params);
    }
    
    // 否则调用父类的getStats方法获取真实统计数据
    return this.getStats(params, options);
  }

  /**
   * 预览HTML代码
   * 获取指定HTML代码的预览内容，可能包含额外的处理（如注入样式、脚本）
   * @param {string|number} id - HTML代码的唯一标识符
   * @param {object} options - 请求选项配置
   * @returns {Promise<string>} 预览用的HTML字符串
   */
  async previewHtmlCode(id, options = {}) {
    // 如果使用模拟数据，返回模拟数据
    if (this.useMockData) {
      await this.mockDelay();
      return previewMockHtmlCode(id);
    }
    
    // 否则直接调用apiClient的get方法，因为预览可能返回纯HTML而不是JSON
    return apiClient.get(API_ENDPOINTS.HTML_CODES.PREVIEW.replace(':id', id), {
      ...this.options,
      ...options,
      headers: {
        ...options.headers,
        'Accept': 'text/html', // 期望接收HTML内容
      },
    });
  }

  /**
   * 验证HTML代码
   * 向后端发送HTML代码内容进行语法或结构验证
   * @param {string} htmlContent - 要验证的HTML代码字符串
   * @param {object} options - 请求选项配置
   * @returns {Promise<object>} 验证结果，包含是否有效、错误信息等
   */
  async validateHtmlCode(htmlContent, options = {}) {
    // 如果使用模拟数据，返回模拟数据
    if (this.useMockData) {
      await this.mockDelay();
      return validateMockHtmlCode(htmlContent);
    }
    
    // 否则发送真实API请求
    return apiClient.post(API_ENDPOINTS.HTML_CODES.VALIDATE, { html: htmlContent }, {
      ...this.options,
      ...options,
    });
  }
}

// 创建并导出服务实例
export const htmlCodeService = new HtmlCodeService();
export default HtmlCodeService;
